<?php
class Ebay_Api_Call_Log extends QDB_ActiveRecord_Abstract
{
	/**
	 * 返回对象的定义
	 *
	 * @static
	 *
	 * @return array
	 */
	static function __define()
	{
		return array
		(
			// 指定该 ActiveRecord 要使用的行为插件
			'behaviors' => '',

			// 指定行为插件的配置
			'behaviors_settings' => array
			(
			    # '插件名' => array('选项' => 设置),
			),

			// 用什么数据表保存对象
			'table_name' => 'ebay_api_call_log',

			// 指定数据表记录字段与对象属性之间的映射关系
			// 没有在此处指定的属性，QeePHP 会自动设置将属性映射为对象的可读写属性
			'props' => array
			(
				// 主键应该是只读，确保领域对象的“不变量”
				'id' => array('readonly' => true),

				/**
				 *  可以在此添加其他属性的设置
				 */
				# 'other_prop' => array('readonly' => true),

				/**
				 * 添加对象间的关联
				 */
				# 'other' => array('has_one' => 'Class'),

			),

			/**
			 * 允许使用 mass-assignment 方式赋值的属性
			 *
			 * 如果指定了 attr_accessible，则忽略 attr_protected 的设置。
			 */
			'attr_accessible' => '',

			/**
			 * 拒绝使用 mass-assignment 方式赋值的属性
			 */
			'attr_protected' => 'id',

			/**
			 * 指定在数据库中创建对象时，哪些属性的值不允许由外部提供
			 *
			 * 这里指定的属性会在创建记录时被过滤掉，从而让数据库自行填充值。
			 */
			'create_reject' => '',

			/**
			 * 指定更新数据库中的对象时，哪些属性的值不允许由外部提供
			 */
			'update_reject' => '',

			/**
			 * 指定在数据库中创建对象时，哪些属性的值由下面指定的内容进行覆盖
			 *
			 * 如果填充值为 self::AUTOFILL_TIMESTAMP 或 self::AUTOFILL_DATETIME，
			 * 则会根据属性的类型来自动填充当前时间（整数或字符串）。
			 *
			 * 如果填充值为一个数组，则假定为 callback 方法。
			 */
			'create_autofill' => array
			(
				# 属性名 => 填充值
				# 'is_locked' => 0,
			),

			/**
			 * 指定更新数据库中的对象时，哪些属性的值由下面指定的内容进行覆盖
			 *
			 * 填充值的指定规则同 create_autofill
			 */
			'update_autofill' => array
			(
			),

			/**
			 * 在保存对象时，会按照下面指定的验证规则进行验证。验证失败会抛出异常。
			 *
			 * 除了在保存时自动验证，还可以通过对象的 ::meta()->validate() 方法对数组数据进行验证。
			 *
			 * 如果需要添加一个自定义验证，应该写成
			 *
			 * 'title' => array(
			 *	array(array(__CLASS__, 'checkTitle'), '标题不能为空'),
			 * )
			 *
			 * 然后在该类中添加 checkTitle() 方法。函数原型如下：
			 *
			 * static function checkTitle($title)
			 *
			 * 该方法返回 true 表示通过验证。
			 */
			'validations' => array
			(
			),
		);
	}


/* ------------------ 以下是自动生成的代码，不能修改 ------------------ */

	/**
	 * 开启一个查询，查找符合条件的对象或对象集合
	 *
	 * @static
	 *
	 * @return QDB_Select
	 */
	static function find()
	{
		$args = func_get_args();
		return QDB_ActiveRecord_Meta::instance(__CLASS__)->findByArgs($args);
	}

	/**
	 * 返回当前 ActiveRecord 类的元数据对象
	 *
	 * @static
	 *
	 * @return QDB_ActiveRecord_Meta
	 */
	static function meta()
	{
		return QDB_ActiveRecord_Meta::instance(__CLASS__);
	}


/* ------------------ 以上是自动生成的代码，不能修改 ------------------ */
	
	static function checkAPICallStatus()
	{
		$api_call_quantity = Ebay_Api_Call_Log::find('status=?', Q::ini('custom_flag/ebay_api_call_log_status/active/value'))->getCount();
		$sleep_quantity = 0;
		while ($api_call_quantity >= Q::ini('custom_flag/ebay_api_call_log_threshold/api_call/value'))
		{
			if ($sleep_quantity >= Q::ini('custom_flag/ebay_api_call_log_threshold/sleep/value'))
			{
				$subject = 'ebayAPI请求有异常';
				$body = 'ebayAPI请求日志表（ebay_api_call_log）有连续有API的请求数超过了ebayAPI请求阀值（' . Q::ini('custom_flag/ebay_api_call_log_threshold/api_call/value') . '）的情况！';
				Helper_BSS_Normal::sendMail($subject, $body, 'group3');
				return array('ack' => FAILURE, 'message' => 'ebayAPI请求次数过于频繁，请稍等片刻');
			}
			sleep(1);
			$api_call_quantity = Ebay_Api_Call_Log::find('status=?', Q::ini('custom_flag/ebay_api_call_log_status/active/value'))->getCount();
			$sleep_quantity++;
		}
		return array('ack' => SUCCESS, 'message' => '');
	}
	
	static function initLog($init_log)
	{
		$log = new Ebay_Api_Call_Log();
		$log->api_name = $init_log['api_name'];
		$log->status = Q::ini('custom_flag/ebay_api_call_log_status/active/value');
		$log->box_time = CURRENT_DATETIME;
		$log->execute_time = date('Y-m-d H:i:s');
		$log->execute_user_id = CURRENT_USER_ID ? CURRENT_USER_ID : NULL;
		$log->save();
		return array('ack' => SUCCESS, 'message' => '', 'id' => mysql_insert_id());
	}
	
	static function completedLog($completed_log)
	{
		$log = Ebay_Api_Call_Log::find('id=?', $completed_log['id'])->getOne();
		if ($log['id'])
		{
			$log->status = $completed_log['status'];
			$log->execute_microtime = $completed_log['execute_microtime'];
			$log->ack = $completed_log['ack'];
			$log->message = $completed_log['message'];
			$log->filename = $completed_log['filename'];
			$log->other_flag = $completed_log['other_flag'];
			$log->errno = $completed_log['errno'];
			$log->save();
			return array('ack' => SUCCESS, 'message' => '');
		}
		else
		{
			return array('ack' => FAILURE, 'message' => '找不到日志记录');
		}
	}
	
	/**
	 * 请求标记完成
	 * @param $ebay_api_call_log_ids 
	 */
	static function markStatusCompleted($ebay_api_call_log_ids)
	{
		$message = array();
		foreach ($ebay_api_call_log_ids as $id)
		{
			$judge_result = Ebay_Api_Call_Log::judgeMarkStatusCompleted($id);
			if ($judge_result['ack'] == SUCCESS)
			{
				QDB::getConn()->execute('update ebay_api_call_log set status=' . Q::ini('custom_flag/ebay_api_call_log_status/completed/value') . ' where id=' . $id);
			}
			else
			{
				$message[] = $judge_result['message'];
			}
		}
		if ($message)
		{
			return array('ack' => PARTIAL_FAILURE, 'message' => implode("\n", $message));
		}
		else
		{
			return array('ack' => SUCCESS, 'message' => '');
		}
	}
	
	/**
	 * 判断是够满足标记完成条件
	 * @param $ebay_api_call_log_id 
	 */	
	static function judgeMarkStatusCompleted($ebay_api_call_log_id)
	{
		$ebay_api_call_log = Ebay_Api_Call_Log::find('id=?', $ebay_api_call_log_id)->asArray()->getOne();
		if ($ebay_api_call_log)
		{
			if ($ebay_api_call_log['status'] == Q::ini('custom_flag/ebay_api_call_log_status/active/value'))
			{
				return array('ack' => SUCCESS, 'message' => '');
			}
			else
			{
				return array('ack' => FAILURE, 'message' => $ebay_api_call_log['id'] . $ebay_api_call_log['api_name'] . ': 该请求日志状态是：' . Helper_BSS_Normal::getIniOne('ebay_api_call_log_status', 'value', $ebay_api_call_log['status'], 'name'));
			}
		}
		else
		{
			return array('ack' => FAILURE, 'message' => '请求日志ID：' . $ebay_api_call_log_id . '不存在！');
		}
	}
	
	static function search($condition, $cp, $ps)
	{
		$where = Ebay_Api_Call_Log::buildSearchWhere($condition);
		$columns = array(
			'ebay_api_call_log.*',
			'user.name as execute_user_name'
		);
		$select = Ebay_Api_Call_Log::find($where)
			->joinLeft('user', '', 'user.id = ebay_api_call_log.execute_user_id')
			->setColumns($columns)->order('ebay_api_call_log.id desc');
		if ($cp == 0 && $ps == 0)
		{
			$pagination = array();
		}
		else
		{
			$select->limitPage($cp, $ps);
			$pagination = $select->getPagination();
		}
		$result = $select->asArray()->getAll();
		return array('ack' => SUCCESS, 'message' => '', 'data' => $result, 'pagination' => $pagination);
	}
	
	static function buildSearchWhere($condition)
	{
		$where = '1';
		if ( ! empty($condition['api_name']))
		{
			$where .= ' and ebay_api_call_log.api_name like \'%' . $condition['api_name'] . '%\'';
		}
		if ( ! empty($condition['begin_box_time']))
		{
			$where .= ' and ebay_api_call_log.box_time >=\'' . $condition['begin_box_time'] . '\'';
		}
		if ( ! empty($condition['end_box_time']))
		{
			$where .= ' and ebay_api_call_log.box_time <=\'' . $condition['end_box_time'] . '\'';
		}
		if ( ! empty($condition['begin_execute_time']))
		{
			$where .= ' and ebay_api_call_log.execute_time >=\'' . $condition['begin_execute_time'] . '\'';
		}
		if ( ! empty($condition['end_execute_time']))
		{
			$where .= ' and ebay_api_call_log.execute_time <=\'' . $condition['end_execute_time'] . '\'';
		}
		if ( ! empty($condition['user_id']))
		{
			$user = implode(',', $condition['user_id']);
			$where .= ' and ebay_api_call_log.execute_user_id in (' . $user . ')';
		}
		if ( ! empty($condition['status']))
		{
			$status_filter = '0';
			foreach (Q::ini('custom_flag/ebay_api_call_log_status') as $s)
			{
				if (isset($condition['status'][$s['value']]) && $condition['status'][$s['value']] == $s['value'])
				{
					$status_filter .= ' or ebay_api_call_log.status=\'' . $s['value'] . '\'';
				}
			}
			$where .= ' and (' . $status_filter . ')';
		}
		return $where;
	}
}